package cmd

import (
	"github.com/spf13/cobra"
	"go-programming-tour-book/tour/internal/word"
	"log"
	"strings"
)

/*
用于放置单词格式转换的子命令 word
*/

// 定义目前单词所支持的转换模式枚举值
const (
	ModeUpper                      = iota + 1 //全部单词转为大写
	ModeLower                                 //全部单词转为小写
	ModeUnderscoreToUpperCamelCase            //下划线单词转为大写驼峰单词
	ModeUnderscoreToLowerCamelCase            //下划线单词转为小写驼峰单词
	ModeCamelCaseToUnderscore                 //驼峰单词转为下划线单词
)

var str string
var mode int8

// 对具体的单词子命进行设置和集成
var desc = strings.Join([]string{
	"孩子命令支持各种单词格式转换，模式如下：",
	"1：全部单词转为大写",
	"2：全部单词转为小写",
	"3：下划线单词转为大写驼峰单词",
	"4：下划线单词转为小写驼峰单词",
	"5：驼峰单词转为下划线单词",
}, "\n")

var wordCmd = &cobra.Command{
	Use:   "word",   //子命令的命令标识
	Short: "单词格式转换", //简短说明，在 help 命令输出的帮助信息中展示
	Long:  desc,     //完整说明，在 help 命令输出的帮助信息中展示
	Run: func(cmd *cobra.Command, args []string) {
		var content string
		switch mode {
		case ModeUpper:
			content = word.ToUpper(str)
		case ModeLower:
			content = word.ToLower(str)
		case ModeUnderscoreToUpperCamelCase:
			content = word.UnderscoreToUpperCamelCase(str)
		case ModeUnderscoreToLowerCamelCase:
			content = word.UnderScoreToLowerCamelCase(str)
		case ModeCamelCaseToUnderscore:
			content = word.CamelCaseToUnderscore(str)
		default:
			log.Fatalf("暂不支持该转换模式，请执行 help word 查看帮助文档")
		}

		log.Printf("输出结果：%s", content)
	},
}

func init() {
	//在 VarP 系列的方法中，第一个参数为需要绑定的变量，第二个参数为接收该参数的完整的命令标志，第三个参数为对应的短标识，第四个参数为默认值，第五个参数为使用说明
	wordCmd.Flags().StringVarP(&str, "str", "s", "", "请输入单词内容")
	wordCmd.Flags().Int8VarP(&mode, "mode", "m", 0, "请输入单词转换的格式")
}
